// 1. promise是什么?
// promise是es6新增的一种用于解决异步操作的方案。主要解决的是传统的处理异步的回调函数的回调地狱问题

// const fs = require('fs'); // 引入nodejs的fs模块
// fs.readFile('./01-作业.html', 'utf8', (err, data) => {
//   console.log(data); // 1
//   fs.readFile('./02-Promise.html', 'utf8', (err, data) => {
//     console.log(data); // 2
//     fs.readFile('./03-Promise2.html', 'utf8', (err, data) => {
//       console.log(data); // 3
//     });
//   });
// }); // readFile是一个异步方法
// console.log(3);





// 2. promise有哪几种状态？
// 一共有三种状态：pending（进行中）、fulfilled（已成功）和rejected（已失败）
// 状态只能从pending -> fulfilled 或者 pending -> rejected





// 3. promise的创建
// 固定语法，创建promise实例。Promise构造函数接受一个函数作为参数，这个函数有两个参数分别是resolve, reject
// resolve函数调用相当于是将promise的状态从进行中变成已成功
// reject函数调用相当于是将promise的状态从进行中变成已失败
// const p = new Promise((resolve, reject) => {
//   fs.readFile('./03-Promise.html', 'utf8', (err, data) => {
//     if (err) {
//       reject(err);
//     } else {
//       resolve(data);
//     }
//   });
// });

// .then方法是在当promise实例的状态变成fulfilled的时候执行
// .catch方法是在当promise实例的状态变成rejected的时候执行
// p
//   .then((res) => {
//     // then的res就是resolve传递的data
//     console.log(res);
//   })
//   .catch((err) => {
//     console.log(err.message);
//   })




// 4. 如何解决回调函数的问题？
// 通常会定义函数的方式来做
// const readFile = (url) => {
//   return new Promise((resolve, reject) => {
//     fs.readFile(url, 'utf8', (err, data) => {
//       if (err) {
//         reject(err);
//       } else {
//         resolve(data);
//       }
//     });
//   });
// }
// 前面一个then的return的结果变成成功了，那么就会执行下一个then
// 并且将这个成功的结果给到下一个then的参数
// readFile("./01-作业.html")
//   .then(res => {
//     console.log(res);
//     return readFile("./02-Promise.html")
//   })
//   .then(res2 => {
//     console.log(res2);
//     return readFile("./03-Promise2.html")
//   })
//   .then(res3 => {
//     console.log(res3);
//   })









const delay = (time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(time);
    }, time)
  })
}
delay(1000)
  .then((res) => {
    console.log(res);
    console.log(aaa); // 报错了
    return delay(2000);
  })
  .then((res2) => {
    console.log(res2);
    return delay(3000);
  })
  .then((res3) => {
    console.log(res3);
  })
  .catch((err) => {
    // .then里面的代码如果报错了，那么也会执行后面的catch方法
    console.log("catch了");
    console.log(err);
  })
  .finally(() => {
    console.log("promise结束了");
  })